package de.nak.terminumfrageapp.service;

import java.util.ArrayList;
import java.util.List;

import de.nak.terminumfrageapp.dao.RueckmeldungDAO;
import de.nak.terminumfrageapp.model.Benutzer;
import de.nak.terminumfrageapp.model.Rueckmeldung;
import de.nak.terminumfrageapp.model.Termin;
import de.nak.terminumfrageapp.model.Umfrage;

/**
 * 
 * @author Tim Danker
 * @description Service-Klasse fuer "Rueckmeldung"
 *
 */
public class RueckmeldungService implements IRueckmeldungService {

	/** RueckmeldungDAO */
	private RueckmeldungDAO rueckmeldungDAO;

	/** Getter und Setter */
	public RueckmeldungDAO getRueckmeldungDAO() {
		return rueckmeldungDAO;
	}

	public void setRueckmeldungDAO(RueckmeldungDAO rueckmeldungDAO) {
		this.rueckmeldungDAO = rueckmeldungDAO;
	}

	/** Methoden */


	/**
	 * @description liefert eine Liste von Benutzern mit Zusagen fuer eine
	 *              mitgegeben Umfrage.
	 * @return ArrayList von Benutzern
	 * @param Umfrage, Benutzer
	 */
	public ArrayList<Benutzer> listeVonBenutzernMitZusage(Umfrage umfrage,
			Benutzer benutzer) {
		return rueckmeldungDAO.listeVonBenutzerMitZusage(umfrage, benutzer);
	}

	/**
	 * @description liefert ein Array mit Rueckmeldungen fuer eine Liste von
	 *              Benutzern, eine Liste von Terminen und einen mitgebenen
	 *              Benutzer, der ausgenommen wird von der Rueckgabe.
	 * @return zweidimensionales Array von Rueckmeldungen mit Integer-BenutzerId
	 *         und Integer-TerminId als Dimensionen
	 * @param List<Benutzer>, List<Termin>, Benutzer
	 */
	public Rueckmeldung[][] arrayVonRueckmeldungen(
			List<Benutzer> benutzerListe, List<Termin> terminListe,
			Benutzer eigenerBenutzer) {
		return rueckmeldungDAO.arrayVonRueckmeldungen(benutzerListe,
				terminListe, eigenerBenutzer);
	}

	/**
	 * @description liefert ein Array mit Rueckmeldungen fuer eine Liste von
	 *              Terminen fuer einen mitgegebenen Benutzer.
	 * @return zweidimensionales Array von Rueckmeldungen mit Integer-BenutzerId
	 *         und Integer-TerminId als Dimensionen
	 * @param Benutzer, List<Termin>
	 */
	public Rueckmeldung[][] arrayVonEigenenRueckmeldungen(Benutzer benutzer,
			List<Termin> terminListe) {
		return rueckmeldungDAO.arrayVonEigenenRueckmeldungen(benutzer,
				terminListe);
	}

	/**
	 * @description erstellt eine Rueckmeldung fuer einen Termin, einen Benutzer
	 *              und eine Umfrage, abhaengig vom mitgebenen Benutzer wird die
	 *              Zusage als true oder false angelegt.
	 * @param Termin, Benutzer, Umfrage
	 */
	public void erstelleRueckmeldung(Termin termin, Benutzer benutzer,
			Umfrage umfrage) {

		Rueckmeldung rueckmeldung = new Rueckmeldung();
		rueckmeldung.setBenutzer(benutzer);
		rueckmeldung.setTermin(termin);
		rueckmeldung.setUmfrage(umfrage);
		// wenn der Benutzer der Ersteller der Umfrage ist, soll die
		// Rueckmeldung
		// mit Zusage=true angelegt werden, fuer alle anderen mit Zusage=false
		if (benutzer.getId() == umfrage.getErsteller().getId()) {
			// Benutzer = Ersteller => Zusage = true
			rueckmeldung.setZusage(true);
		} else {
			// Benutzer != Ersteller => Zusage = false
			rueckmeldung.setZusage(false);
		}
		termin.rueckmeldungZuordnen(rueckmeldung);
		benutzer.rueckmeldungZuordnen(rueckmeldung);
		rueckmeldungDAO.erstelleRueckmeldung(rueckmeldung);
	}

	/**
	 * @description prueft, ob der mitgegebene Benutzer fuer einen mitgegebenen
	 *              Termin bereits eine Rueckmeldung hat.
	 * @return Boolean-Wert
	 * @param Benutzer, Termin
	 */
	@Override
	public boolean hatBenutzerRueckmeldung(Benutzer benutzer, Termin termin) {
		return rueckmeldungDAO.hatBenutzerRueckmeldung(benutzer, termin);
	}

	/**
	 * @description laedt eine Liste mit Umfragen, fuer die der mitgegebene
	 *              Benutzer bereits eine Rueckmeldung hat.
	 * @return eine Liste mit Umfragen
	 * @param Benutzer
	 */
	@Override
	public List<Umfrage> ladeUmfragenMitRueckmeldung(Benutzer benutzer) {
		return rueckmeldungDAO.ladeUmfragenMitRueckmeldung(benutzer);
	}

	/**
	 * @description speichert eine mitgegebe Rueckmeldung.
	 * @param Rueckmeldung
	 */
	@Override
	public void speichere(Rueckmeldung rueckmeldung) {
		rueckmeldungDAO.speichern(rueckmeldung);

	}

	/**
	 * @description laedt eine Liste mit Anzahl der Zusagen fuer eine
	 *              mitgegebene Liste von Terminen.
	 * @return ArrayList<Long> mit Anzahl der Zusagen fuer einen Termin
	 * @param List<Termin>
	 */
	@Override
	public ArrayList<Long> ladeAnzahlZusagenProTermin(List<Termin> terminListe) {
		return rueckmeldungDAO.ladeAnzahlZusagenProTermin(terminListe);
	}

	/**
	 * @description laedt eine Liste mit Umfragen fuer die mitgegeben Liste von
	 *              (allen) Umfragen fuer die der mitgegebene Benutzer noch
	 *              keine Rueckmeldung hat.
	 * @return eine Liste mit Umfragen
	 * @param Benutzer, List<Umfrage>
	 */
	@Override
	public List<Umfrage> ladeUmfragenOhneRueckmeldung(Benutzer benutzer,
			List<Umfrage> alleUmfragen) {
		return rueckmeldungDAO.ladeUmfragenOhneRueckmeldung(benutzer,
				alleUmfragen);
	}

	/**
	 * @description loescht alle Rueckmeldungen fuer eine mitgebene TerminId.
	 * @param Termin-Id
	 */
	@Override
	public void loescheAlleRueckmeldungen(Long ausgewaehlteTerminId) {
		rueckmeldungDAO.loescheAlleRueckmeldungen(ausgewaehlteTerminId);

	}

}
